﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BizVal.Domain
{
    public class LabelSet : ICollection<TriangularLabel>
    {
        List<TriangularLabel> labelSet;

        /// <summary>
        /// Gets or sets the <see cref="BizVal.Domain.TriangularLabel"/> at the specified index.
        /// </summary>
        public TriangularLabel this[int index]
        {
            get
            {
                return labelSet[index];
            }
            set
            {
                labelSet[index] = value;
            }
        }


        /// <summary>
        /// Initializes a new instance of the <see cref="LabelSet"/> class.
        /// </summary>
        /// <param name="set">The set.</param>
        public LabelSet(TriangularLabel[] set)
        {
            labelSet = new List<TriangularLabel>(set);
        }



        /// <summary>
        /// Agrega un elemento a <see cref="T:System.Collections.Generic.ICollection`1"/>.
        /// </summary>
        /// <param name="item">Objeto que se va a agregar a <see cref="T:System.Collections.Generic.ICollection`1"/>.</param>
        /// <exception cref="T:System.NotSupportedException"><see cref="T:System.Collections.Generic.ICollection`1"/> es de sólo lectura.</exception>
        public void Add(TriangularLabel item)
        {
            this.labelSet.Add(item);
        }

        /// <summary>
        /// Quita todos los elementos de <see cref="T:System.Collections.Generic.ICollection`1"/>.
        /// </summary>
        /// <exception cref="T:System.NotSupportedException"><see cref="T:System.Collections.Generic.ICollection`1"/> es de sólo lectura. </exception>
        public void Clear()
        {
            this.labelSet.Clear();
        }

        /// <summary>
        /// Determina si <see cref="T:System.Collections.Generic.ICollection`1"/> contiene un valor específico.
        /// </summary>
        /// <param name="item">Objeto que se va a buscar en <see cref="T:System.Collections.Generic.ICollection`1"/>.</param>
        /// <returns>
        /// Es true si <paramref name="item"/> se encuentra en <see cref="T:System.Collections.Generic.ICollection`1"/>; en caso contrario, es false.
        /// </returns>
        public bool Contains(TriangularLabel item)
        {
            return this.labelSet.Contains(item);
        }

        /// <summary>
        /// Copies to.
        /// </summary>
        /// <param name="array">The array.</param>
        /// <param name="arrayIndex">Index of the array.</param>
        public void CopyTo(TriangularLabel[] array, int arrayIndex)
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// Obtiene el número de elementos incluidos en <see cref="T:System.Collections.Generic.ICollection`1"/>.
        /// </summary>
        /// <returns>El número de elementos incluidos en <see cref="T:System.Collections.Generic.ICollection`1"/>.</returns>
        public int Count
        {
            get { return this.labelSet.Count; }
        }

        /// <summary>
        /// Obtiene un valor que indica si <see cref="T:System.Collections.Generic.ICollection`1"/> es de sólo lectura.
        /// </summary>
        /// <returns>
        /// Es true si <see cref="T:System.Collections.Generic.ICollection`1"/> es de sólo lectura; en caso contrario, es false.</returns>
        public bool IsReadOnly
        {
            get { return false; }
        }

        /// <summary>
        /// Quita la primera aparición de un objeto específico de <see cref="T:System.Collections.Generic.ICollection`1"/>.
        /// </summary>  
        /// <param name="item">Objeto que se va a quitar de <see cref="T:System.Collections.Generic.ICollection`1"/>.</param>
        /// <returns>
        /// Es true si <paramref name="item"/> se ha quitado correctamente de <see cref="T:System.Collections.Generic.ICollection`1"/>; en caso contrario, es false. Este método también devuelve false si no se encontró <paramref name="item"/> en la interfaz <see cref="T:System.Collections.Generic.ICollection`1"/> original.
        /// </returns>
        /// <exception cref="T:System.NotSupportedException"><see cref="T:System.Collections.Generic.ICollection`1"/> es de sólo lectura.</exception>
        public bool Remove(TriangularLabel item)
        {
            bool deleted = false;
            if (this.labelSet.Contains(item))
            {
                this.labelSet.Remove(item);
                deleted = true;
            }
            return deleted;
        }

        /// <summary>
        /// Devuelve un enumerador que recorre en iteración la colección.
        /// </summary>
        /// <returns>
        ///   <see cref="T:System.Collections.Generic.IEnumerator`1"/> que se puede utilizar para recorrer en iteración la colección.
        /// </returns>
        public IEnumerator<TriangularLabel> GetEnumerator()
        {
            return labelSet.GetEnumerator();
        }

        /// <summary>
        /// Devuelve un enumerador que recorre en iteración una colección.
        /// </summary>
        /// <returns>
        /// Objeto <see cref="T:System.Collections.IEnumerator"/> que se puede utilizar para recorrer en iteración la colección.
        /// </returns>
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return labelSet.GetEnumerator();
        }
    }
}
